home *** CD-ROM | disk | FTP | other *** search
- #include <TNB.H>
- #include "extern.h"
-
- /* SCSI コマンド実行処理 */
-
- /*********************************************
-
- int scsi_cmd(
- int id
- SCSI-ID
- int len
- CDB の長さ
- unsigned char *buf
- CDB のアドレス
- int rlen
- データ読み込みの場合、バイト数
- データ書き込みの場合、バイト数|0x80000000
- 0ならデータ読み込み無し
- unsigned char *buf2
- データアドレス
-
- *********************************************/
- int scsi_cmd( int len, unsigned char *buf, int rlen, unsigned char *buf2 )
- {
- int rc;
- register int ID asm("d4");
- ID=SCSI_ID;
- /* セレクションフェーズ */
- rc = S_SELECT(ID);
- if ( rc!=0 ) return(-1);;
- /* コマンドフェース */
- buf[1]=(buf[1]&0x1F)|(ID/0x10000*0x20);
- rc = S_CMDOUT( len, buf );
- if ( rc!=0 ) return(-1);;
- if ( rlen != 0 ){
- /* データインフェーズ */
- if ( dma_fg==0 ) /* DMAC使用フラグ*/
- rc = S_DATAIN_P( rlen, buf2 );
- else rc = S_DATAIN( rlen, buf2 );
- if ( rc==-1 )
- return(-1);
- if ( mach2_fg==0 && rc==-2 ){
- rc=scsi_cmd_sm();
- if ( rc!=0 )
- return(rc);
- return(-2);;
- }
- }
- return( scsi_cmd_sm() );
- }
- /*+++++++++++++*/
- int scsi_cmd__( int len, unsigned char *buf, int rlen, unsigned char *buf2 )
- {
- int rc;
- register int ID asm("d4");
- ID=SCSI_ID;
- /* セレクションフェーズ */
- rc = S_SELECT(ID);
- if ( rc!=0 ) return(-1);;
- /* コマンドフェース */
- buf[1]=(buf[1]&0x1F)|(ID/0x10000*0x20);
- rc = S_CMDOUT( len, buf );
- if ( rc!=0 ) return(-1);;
- if ( rlen != 0 ){
- /* データインフェーズ */
- if ( dma_fg==0 ){ /* DMAC使用フラグ*/
- if ( sct_fg!=0 ){
- rc = S_DATAIN_PI( rlen, buf2 );
- } else if ( stm_fg==0 ){
- rc = S_DATAIN_P( rlen, buf2 );
- } else {
- rc = S_DATAIN_M( rlen, buf2 );
- }
- } else {
- rc = S_DATAIN( rlen, buf2 );
- }
- if ( rc==-1 )
- return(-1);
- if ( mach2_fg==0 && rc==-2 ){
- rc=scsi_cmd_sm();
- if ( rc!=0 )
- return(rc);
- return(-2);;
- }
- }
- return( scsi_cmd_sm() );
- }
- /*++++++++++++++*/
- int scsi_cmd_sm()
- {
- unsigned char status,msg;
- int rc;
- /* ステイタスフェーズ */
- rc = S_STSIN( &status );
- if ( rc!=0 ) return(-1);;
- /* メッセージフェーズ */
- rc = S_MSGIN( &msg );
- if ( rc!=0 ) return(-1);
- return( msg*0x10000 + status );
- }
-
-
- asm("
- _S_DATAIN_PI::
- move.l d3,-(sp)
- move.l 4+4(sp),d3
- move.l 4+8(sp),a1
- move.l #$13,d1 * S_DATAIN_PI
- moveq #$F5,d0
- trap #15
- move.l (sp)+,d3
- rts
- _S_DATAIN_M::
- move.l d3,-(sp)
- move.l 4+4(sp),d3
- move.l 4+8(sp),a1
- move.l #$14,d1 * S_DATAIN_M
- moveq #$F5,d0
- trap #15
- move.l (sp)+,d3
- rts
- _S_DATAIN_P::
- move.l d3,-(sp)
- move.l 4+4(sp),d3
- move.l 4+8(sp),a1
- move.l #$0B,d1 * S_DATAIN_P
- moveq #$F5,d0
- trap #15
- move.l (sp)+,d3
- rts
- _S_DATAOUT_P::
- move.l d3,-(sp)
- move.l 4+4(sp),d3
- move.l 4+8(sp),a1
- move.l #$0C,d1 * S_DATAOUT_P
- moveq #$F5,d0
- trap #15
- move.l (sp)+,d3
- rts
- _S_LEVEL_::
- move.l #$0A,d1
- moveq #$F5,d0
- trap #15
- rts
- _S_MODESELECT::
- movem.l d3-d4,-(sp)
- move.l $000c(sp),d2
- moveq #$00,d3
- move.w $0012(sp),d3
- move.l $0014(sp),d4
- movea.l $0018(sp),a1
- move.l #$2A,d1 * MODESELECT
- moveq #$F5,d0
- trap #15
- movem.l (sp)+,d3-d4
- rts
- _S_MODESENSE::
- movem.l d3-d4,-(sp)
- move.l $000c(sp),d2
- moveq #$00,d3
- move.w $0012(sp),d3
- move.l $0014(sp),d4
- movea.l $0018(sp),a1
- move.l #$29,d1 * MODESENSE
- moveq #$F5,d0
- trap #15
- movem.l (sp)+,d3-d4
- rts
- _S_TW_CHK::
- move.l #$1E,d1
- moveq #$F5,d0
- trap #15
- rts
-
- _S_TW_LEVEL::
- move.l d4,-(sp)
- move.l 4+4(sp),d4
- move.l #$20A,d1
- moveq #$F5,d0
- trap #15
- move.l (sp)+,d4
- rts
-
-
- ");